package com.jdk.demo.nio.networkinterface;

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;

public class NetworkInterfaceDemo {

	// NetworkInterface有多个InterfaceAddress，一个InterfaceAddress对应一个InetAddress，所以一个NetworkInterface有多个InetAddress
	public static void main(String[] args) {
		try {
			Enumeration<NetworkInterface> networkInterface = NetworkInterface.getNetworkInterfaces();
			while(networkInterface.hasMoreElements()) {
				NetworkInterface eachNetworkInterface = networkInterface.nextElement();
				System.out.println("获得网络设备名称：" + eachNetworkInterface.getName());
				System.out.println("获得网络设备显示名称：" + eachNetworkInterface.getDisplayName()); // 设备管理器里会显示这个名称
				System.out.println("获得网络接口索引：" + eachNetworkInterface.getIndex());
				System.out.println("是否已经开启并运行：" + eachNetworkInterface.isUp()); // 如果把网线拔了，就会是false
				System.out.println("是否为回调接口：" + eachNetworkInterface.isLoopback()); // 如果一个网络设备是回调接口，那么它永远工作，并且是虚拟的，也就是计算机上不存在这样的硬件网络设备，那么他存在的意义是什么呢？
				// 如果某台计算机上没有安装物理网卡，但安装了tomcat，那么就可以使用localhost或者127.0.0.1进行访问，这里的localhost或者127.0.0.1就是回调地址
				System.out.println("最大传输单元：" + eachNetworkInterface.getMTU()); // 网络传输中是以数据包为基本传输单位的，可以使用"最大传输单元"来规定网络传输最大数据包的大小，单位为字节。以太网的网卡mtu一般默认是1500字节
				System.out.println("获得网卡物理地址：" + eachNetworkInterface.getHardwareAddress()); // 硬件地址(物理地址、MAC地址)
				Enumeration<InetAddress> enumInetAddress = eachNetworkInterface.getInetAddresses(); // 获得ip(互联网协议)地址的基本信息
				while(enumInetAddress.hasMoreElements()) {
					InetAddress inetAddress = enumInetAddress.nextElement();
					// 获取ip地址的完全限定域名，完全限定域名是指主机名加上全路径，全路径中列出了序列中所有域成员
					System.out.println("获取此ip地址的完全限定域名：" + inetAddress.getCanonicalHostName());
					System.out.println("获取此ip地址的主机名：" + inetAddress.getHostName());
					System.out.println("获取此ip地址的字符串：" + inetAddress.getHostAddress());
					// 获取此InetAddress对象的原始ip地址(byte数组)
					byte[] addressByte = inetAddress.getAddress();
					for (int i = 0; i < addressByte.length; i++) {
						System.out.print(addressByte[i] + " ");
					}
					System.out.println();
				}
				System.out.println("------");
			}
		}catch (Exception e) {
			e.printStackTrace();
		}
	}

}
